#1usr/bin/env python
# -*- coding:utf8 -*-

#PyQt5系列教程（5）：事件与信号处理
#https://zhuanlan.zhihu.com/p/28415799

#信号和槽：信号就是事件，槽其实就触发事件后要执行的函数
import sys,time
from PyQt5.QtCore import Qt,pyqtSignal,QObject
from PyQt5.QtWidgets import QApplication,QLCDNumber,QDial,QWidget,QPushButton,QMessageBox
from PyQt5.QtGui import QPainter

#自定信号(事件)
class MySignal(QObject):
    trigger = pyqtSignal()

class MainWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.pos = None
        #self.setMouseTracking(True) #设置允许鼠标跟踪,设置后就算没有按下鼠标 也会触发鼠标移动事件

        lcd = QLCDNumber(self)
        dial = QDial(self) #刻度盘

        self.setGeometry(300,300,350,250) #设置x,y,w,h
        self.setWindowTitle("事件和信号处理")

        lcd.setGeometry(100,50,150,60)
        lcd.setNumDigits(2) #设置文本框最多显示多少个数字

        dial.setGeometry(120,120,100,100)
        dial.setNotchesVisible(True) #设置刻度可见
        dial.setMinimum(0)
        dial.setMaximum(59)
        dial.setNotchTarget(1) #设置刻度间距
        dial.valueChanged.connect(lcd.display)
        dial.setFocusPolicy(Qt.NoFocus) #设置焦点代理;不能获得焦点,以免影响窗口本身的键盘事件
        
        btn = QPushButton(self)
        btn.setGeometry(25,25,80,30)
        btn.setText("点我啊")
        btn.setObjectName("myBtn")
        btn.setFocusPolicy(Qt.NoFocus)
        btn.clicked.connect(self.btnClick)

        self.mySig = MySignal()
        self.mySig.trigger.connect(self.about)

    def about(self):
        print("触发自定义")
        QMessageBox.about(self,"信号","点击了鼠标")

    def btnClick(self,e):
        sender = self.sender() #获取信号源的方法，也就是事件发送者(鼠标事件有该属性，键盘事件没有)
        print("sender",sender,"e",e)
    
    def mousePressEvent(self,e):
        print("mousePressEvent")
        #self.mySig.trigger.emit() #发送信号

    def keyPressEvent(self,e): #监听键盘事件       
        sd = self.sender()
        print("sd",sd)         
        keyCode = e.key()
        #print("keyCode",keyCode)
        if keyCode==Qt.Key_Up:
            print("press ↑")
        elif keyCode==Qt.Key_Down:
            print("press ↓")
    
    def mouseMoveEvent(self,event):
        print("mouseMoveEvent",time.clock())
        self.pos = event.pos()
        self.update()
    
    def paintEvent(self,event):
        if self.pos:
            p = QPainter(self)
            p.drawLine(0,0,self.pos.x(),self.pos.y())




if __name__=="__main__":
    app = QApplication(sys.argv)
    win = MainWindow()
    win.show()
    sys.exit(app.exec_()) # app.exec_ 执行该函数 qt进入主循环


#窗口需要监听键盘、鼠标等事件都是在内部重新对应方法
#主要内容
'''

信号与槽连接
事件处理重写
事件发送者
发出自定义信号

'''